package com.liusaidh.mapper;

import com.liusaidh.domain.*;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Component
public interface BlogMapper {

    /**
     * 获得我的点赞或者收藏的文章
     *
     * @param id 我的id
     * @return 返回点赞或收藏的文章
     */
    List<AuditBlog> getMyCollectionBlog(@Param("id") Integer id, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 2.用户发布文章
     *
     * @param blog
     */
    int addBlog(Blog blog);

    /**
     * @param id   发布文章：为哪一个文章添加图片url
     * @param urls 添加文章的图片url，可能有多个
     */
    void addPhotoUrl(@Param("id") Integer id, @Param("urls") String[] urls);

    /**
     * @param id   发布文章：为哪一个文章添加视频的url
     * @param urls 添加文章的视频url，可能有多个
     */
    void addVideoUrl(@Param("id") Integer id, @Param("urls") String[] urls);

    /**
     * 3.用户给文章点赞
     *
     * @param uid       用户的id
     * @param bid       文章的id
     * @param localDate 点赞的时间
     */
    @Insert("insert likes (u_id,b_id,publish_time)values(#{uid},#{bid},#{localDate})")
    void likeBlog(@Param("uid") Integer uid, @Param("bid") Integer bid, @Param("localDate") String localDate);

    /**
     * 为文章增加一个点赞
     *
     * @param bid
     */
    @Update("update blog set likes = likes + 1 where id = #{bid}")
    void addOneLikeToBlog(@Param("bid") Integer bid);

    /**
     * 4.用户取消点赞
     *
     * @param uid
     * @param bid
     */
    @Delete("delete from likes where u_id = #{uid} and b_id = #{bid}")
    void notLikeBlog(@Param("uid") Integer uid, @Param("bid") Integer bid);

    /**
     * 为文章减少一个点赞
     *
     * @param bid
     */
    @Update("update blog set likes = likes - 1 where id = #{bid}")
    void deleteOneLikeToBlog(@Param("bid") Integer bid);


    /**
     * 获取待审核的文章给管理员
     *
     * @param pageBeginIndex 开始页索引
     * @param pageSize       每页的数量
     * @return 返回list集合
     */
    List<AuditBlog> getAuditBlogList(@Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 7.查询待审核的文章的数量
     *
     * @return 返回待审核文章的数量
     */
    @Select("select count(*) from blog where state = 0 and exist = 0")
    long getAuditBlogCount();

    /**
     * 8.查询热搜的数据
     *
     * @return
     */
    List<String> getFiftyHotSearchBlog();

    /**
     * 获取前10个标签
     *
     * @return 返回一个list集合
     */
    List<String> getTenHotSearchBlog();

    /**
     * 9.模糊查询文章
     *
     * @param condition 模糊查询的条件
     * @return 返回list集合
     */
    List<String> getSearchBlogByLike(@Param("condition") String condition);

    /**
     * 按热度查询所有的文章
     *
     * @param pageBeginIndex 开始的索引
     * @param pageSize       每页的数量
     * @return 返回list集合
     */
    List<AuditBlog> getAllBlog(@Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 11.获取文章的路径
     *
     * @param id   文章的id
     * @param type 获取文章的url的类型  ： 图片(0)或视频(1)
     * @return
     */
    @Select("select url from url where b_id = #{id} and url_type = #{type}")
    String[] getBlogUrl(@Param("id") Integer id, @Param("type") Integer type);

    /**
     * 12.用户收藏文章
     *
     * @param uid 用户id
     * @param bid 文章id
     * @param msg 记录的信息
     */
    void collectOtherBlog(@Param("uid") Integer uid, @Param("bid") Integer bid, @Param("msg") String msg);

    /**
     * 13获取我发布的文章
     *
     * @param id
     * @return
     */
    @Select("select * from blog where create_by = #{id} and exist = 0 order by published_date desc")
    List<Blog> getMyBlog(@Param("id") Integer id);

    /**
     * 13获取我的草稿箱的文章
     *
     * @param id 我的id
     * @return 返回list集合
     */
    List<AuditBlog> getMyDraftBox(@Param("id") Integer id);


    /**
     * 15.文章通过审核
     *
     * @param id 文章的id
     * @return 返回受影响的行数
     */
    @Update("update blog set state = 1 where id = #{id}")
    int passTheAudit(@Param("id") Integer id);

    /**
     * 16.用户发布一级评论
     *
     * @param uid     用户的id
     * @param bid     文章的id
     * @param comment 评论的内容
     * @param time    发布的时间
     * @return 返回int代表是否成功
     */
    @Insert("insert comment values (null,#{uid},#{bid},#{comment},0,#{time},-1)")
    int publishFirstComment(@Param("uid") Integer uid, @Param("bid") Integer bid, @Param("comment") String comment, @Param("time") LocalDateTime time);

    /**
     * 17.用户发表二级评论
     *
     * @param uid            用户的id
     * @param firstCommentId 一级评论的id
     * @param comment        评论的内容
     * @param time           发布的时间
     * @return 返回int代表是否成功
     */
    @Insert("insert comment values (null,#{uid},null,#{comment},0,#{time},#{firstCommentId})")
    int publishSecondComment(@Param("uid") Integer uid, @Param("firstCommentId") Integer firstCommentId, @Param("comment") String comment, @Param("time") LocalDate time);



    /**
     * 转发文章
     *
     * @param uid     用户的id
     * @param bid     文章的id
     * @param message 转发时记录的信息
     * @param time    转发的时间
     * @return 返回受影响的行数
     */
    int forwardTheBlog(@Param("uid") Integer uid, @Param("bid") Integer bid, @Param("message") String message, @Param("time") String time);

//
//    /**
//     * 26.获得我转发的文章
//     *
//     * @param ids
//     * @return
//     */
//    List<Blog> getTransmitBlog(@Param("ids") Integer[] ids);


    /**
     * 28.获取转发文章的信息
     *
     * @return
     */
    @Select("select message from transmit where uid = #{uid} and bid = #{bid}")
    String getMyTransmitMessage(@Param("uid") Integer uid, @Param("bid") Integer bid);

    /**
     * 29.获取转发文章的信息
     *
     * @return
     */
    @Select("select time from transmit where uid = #{uid} and bid = #{bid}")
    String getMyTransmitTime(@Param("uid") Integer uid, @Param("bid") Integer bid);

    /**
     * 30.用户取消收藏
     *
     * @param uid
     * @param bid
     */
    @Delete("delete from collection where u_id = #{uid} and b_id = #{bid}")
    void notCollectOtherBlog(@Param("uid") Integer uid, @Param("bid") Integer bid);

    /**
     * 查询所有的标签给管理员
     *
     * @param pageBeginIndex 起始索引
     * @param pageSize       每页的数量
     * @return 返回list
     */
    @Select("SELECT DISTINCT label from blog WHERE exist = 0  and hot!=0 ORDER BY (likes + amount) desc limit #{pageBeginIndex},#{pageSize}")
    List<String> getHotBlogForManager(@Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 32.删除热搜
     *
     * @param label 传来标签
     */
    @Update("update blog set hot = 0 where label = #{label}")
    int deleteHotSearchBlog(@Param("label") String label);

    /**
     * 33.不通过审核
     *
     * @param id 文章的id
     * @return 返回受影响的行数
     */
    @Update("update blog set state = 3 where id = #{id}")
    int notPassTheAudit(@Param("id") Integer id);

    /**
     * 获得近两天的热搜文章给用户
     *
     * @param day : 近几天的热搜文章
     * @return 返回list集合
     */
    List<AuditBlog> getTheLatestHotBlog(@Param("day") Integer day, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     *查询类别
     * @param condition 查询条件
     * @return  返回全部的类别
     */
    List<String> getTypeByLike(@Param("condition") String condition);


    /**
     * 获得我的所有的文章，包括待审核的文章（按时间排序）
     *
     * @param id 用户的id
     * @return 全部的文章
     */
    List<MyBlog> getAllMyBlog(@Param("id") Integer id, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);


    List<Type> getAllTypeForManager(@Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize, @Param("type") String type);

    /**
     * 删除对应的类别
     * @param id  类别的id
     * @return  返回受影响的行数
     */
    @Delete("delete from type where id = #{id}")
    int deleteType(@Param("id") Integer id);

    /**
     * 添加类别
     * @param type  类别
     * @return 返回受影响的行数
     */
    @Insert("insert type values(null,#{type})")
    int addType(@Param("type") String type);

    /***
     * 查询全部类别的数量
     * @return
     */
    Long getAllTypeCount(@Param("type") String type);

    /**
     *
     * @param types
     * @return
     */
    Integer[] getTypeIds(@Param("types") String[] types);

    /**
     * 为文章添加类别
     *
     * @param id  文章的id
     * @param ids 类别的id
     */
    void addTypeForBlog(@Param("id") Integer id, @Param("ids") Integer[] ids);

    @Select("select DISTINCT label from blog")
    String[] getLabelCount();

    /**
     * 获取全部的标签的数量
     * @return 返回标签的数量
     */
    Long getAllLabelCount();

    /**
     * 获取全部文章的评论
     *
     * @param id 文章的id
     * @return 返回全部的评论
     */
    List<UserReviews> getBlogComment(@Param("id") Integer id);

    /**
     * 获取全部文章的评论
     *
     * @param id 文章的id
     * @return 返回全部的二级评论
     */
    List<UserReviews> getSecondComment(@Param("id") Integer id);

    /**
     * 获取图片的地址
     *
     * @param id 文章的id
     * @return 返回图片的地址
     */
    String[] getBlogPictureUrl(@Param("id") Integer id);

    /**
     * 获得我最近关注的文章
     *
     * @param id 我的id
     * @return 返回list集合
     */
    List<AuditBlog> getMyLatestConnectionBlog(@Param("id") Integer id, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 判断是否是我的关注
     *
     * @param myId    我的id
     * @param otherId 其他用户的id
     * @return 返回 1 代表关注，0 代表未关注
     */
    int judgeUserOfConnection(@Param("myId") Integer myId, @Param("otherId") Integer otherId);

    /**
     * 判断是不是我的点赞
     *
     * @param myId   我的id
     * @param blogId 文章的id
     * @return 1 代表是  0  代表不是
     */
    int judgeBlogOfLike(@Param("myId") Integer myId, @Param("blogId") Integer blogId);

    /**
     * 判断是不是我的收藏
     *
     * @param myId   我的id
     * @param blogId 文章的id
     * @return 1 代表是  0  代表不是
     */
    int judgeBlogOfCollection(@Param("myId") Integer myId, @Param("blogId") Integer blogId);

    /**
     * 判断是不是我的转发
     *
     * @param myId   我的id
     * @param blogId 文章的id
     * @return 1 代表是  0  代表不是
     */
    int judgeBlogOfTransmit(@Param("myId") Integer myId, @Param("blogId") Integer blogId);

    /**
     * 获取将要加载的文章
     *
     * @param pageBeginIndex 起始索引
     * @param pageSize       每页的数量
     * @return 返回list集合
     */
    List<AuditBlog> getTheLoadedBlog(@Param("pageBeginIndex") int pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 根据id删除文章
     *
     * @param id 文章的id
     * @return 返回受影响的行数
     */
    int deleteBlogById(@Param("id") Integer id);

    /**
     * 点赞评论
     *
     * @param uid       用户的id
     * @param commentId 评论的id
     * @param time      点赞的时间
     * @return 返回受影响的行数
     */
    int likeComment(@Param("uid") Integer uid, @Param("commentId") Integer commentId, @Param("time") LocalDateTime time);

    /**
     * 取消点赞评论
     *
     * @param uid       用户的id
     * @param commentId 评论的id
     * @return 返回受影响的行数
     */
    int notLikeComment(@Param("uid") Integer uid, @Param("commentId") Integer commentId);

    /**
     * 判断评论是不是被用户点赞
     *
     * @param uid       用户的id
     * @param commentId 评论的id
     * @return 有几条结果
     */
    int judgeCommentOfLike(@Param("uid") Integer uid, @Param("commentId") Integer commentId);

    /**
     * 为评论加一个点赞
     *
     * @param id 评论的id
     * @return 返回受影响的行数
     */
    int addOneLikeForComment(@Param("id") Integer id);

    /**
     * 为评论减去一个点赞
     *
     * @param id 评论的id
     * @return 返回受影响的行数
     */
    int deleteOneLikeForComment(@Param("id") Integer id);

    /**
     * 用户举报文章
     *
     * @param uid  用户id
     * @param bid  文章id
     * @param msg  举报的原因
     * @param time 举报的时间
     * @return 返回影响的行数
     */
    int reportBlog(@Param("uid") Integer uid, @Param("bid") Integer bid, @Param("msg") String msg, @Param("time") String time);

    /**
     * 获取举报信息
     * @param id 用户的id
     * @return  返回list
     */
    List<Report> getReportForUser(@Param("id") Integer id, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    /**
     * 用户删除评论
     * @param id 评论的id
     * @return 返回行数
     */
    int deleteComment(@Param("id") Integer id);

    /**
     * 模糊查询标签（没条件就查询所有的标签）
     * @param condition  条件
     * @return 返回标签
     */
    List<String> getLabelByLike(@Param("condition") String condition);

    /**
     * 查询所有的标签给管理员
     * @param pageBeginIndex 当前的起始索引
     * @param pageSize 每页的数量
     * @return 返回标签
     */
    List<Label> getLabelForManager(@Param("pageBeginIndex") Integer pageBeginIndex,@Param("pageSize") Integer pageSize);

    /**
     * 查询所有的数量
     * @return 返回数量
     */
    long getLabelTotal();

    /**
     * 删除热搜的标签
     * @param id 标签的id
     * @return 返回行数
     */
    int deleteHotLabel(@Param("id") Integer id);

    /**
     * 查询所有的被举报的文章给管理员
     * @return 返回list集合
     */
    List<ReportCopy> getReportForManager(@Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);
    List<String> getReportList(@Param("id") Integer id);
    Integer getReportNumber(@Param("id") Integer id);
    Long getAllReportCount();

    /**
     * 通过id获取文章
     * @param id  文章的id
     * @return  返回AuditBlog对象
     */
    AuditBlog getAuditBlogById(@Param("id") Integer id);

    List<AuditBlog> getMyLikeBlogList(@Param("id") Integer id, @Param("pageBeginIndex") int pageBeginIndex, @Param("pageSize") Integer pageSize);

    List<AuditBlog> getMyCollectionBlogList(@Param("id") Integer id, @Param("pageBeginIndex") int pageBeginIndex, @Param("pageSize") Integer pageSize);

    @Update("update blog set transmit = transmit + 1 where id = #{bid}")
    void addOneTransmitForBlog(@Param("bid") Integer bid);

    /**
     * 通过举报
     * @param id 文章的id
     * @return 返回行数
     */
    int passReport(@Param("id") Integer id);

    /**
     * 驳回举报
     * @param id 文章的id
     * @return 返回行数
     */
    int notPassReport(@Param("id") Integer id);

    /**
     * 通过文章的标签获取文章的id
     * @param label 标签
     * @return 返回id
     */
    Integer getLabelIdByLabel(@Param("label") String label);

    /**
     * 添加一个标签
     * @param label 标签
     * @return  label
     */
    Integer addNewLabel(@Param("label") String label,@Param("date") LocalDateTime date);

    /**
     * 为文章添加标签
     * @param blogId  文章的id
     * @param labelId  标签的id
     */
    void addLabelForBlog(@Param("blogId") Integer blogId, @Param("labelId") Integer labelId);

    /**
     * 根据标签查询数据
     * @param label  标签
     * @return  返回数据
     */
    List<AuditBlog> getAuditSearchBlogByLike(@Param("label") String label, @Param("pageBeginIndex") Integer pageBeginIndex, @Param("pageSize") Integer pageSize);

    @Select("select * from user where id > #{condition}")
    List<User> test(@Param("condition") Integer condition);
}